package com.gta.edu.sdk.base.dao.provider;

import static org.apache.ibatis.jdbc.SqlBuilder.BEGIN;
import static org.apache.ibatis.jdbc.SqlBuilder.DELETE_FROM;
import static org.apache.ibatis.jdbc.SqlBuilder.INSERT_INTO;
import static org.apache.ibatis.jdbc.SqlBuilder.SET;
import static org.apache.ibatis.jdbc.SqlBuilder.SQL;
import static org.apache.ibatis.jdbc.SqlBuilder.UPDATE;
import static org.apache.ibatis.jdbc.SqlBuilder.VALUES;
import static org.apache.ibatis.jdbc.SqlBuilder.WHERE;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.gta.edu.sdk.common.cache.TableMapperCache;
import com.gta.edu.sdk.common.dto.EntityTableMapDto;
import com.gta.edu.sdk.mybatis.common.Entity;
import com.gta.edu.sdk.util.IdGen;
import com.gta.edu.sdk.util.StringUtil;

/**
 * @description sql语句提供生成
 * @author fengya
 * @2017年5月18日
 */
public class SqlProvider {
	private static final Logger LOG = LogManager.getLogger(SqlProvider.class);
	private EntityTableMapDto dto = null;

	/**
	 * @description 根据实体类进行表影射插入数据操作
	 * @author fengya
	 * @date 2017年5月18日 上午9:16:07
	 * @param entity
	 * @return
	 * @throws 
	 * @return String
	 */
	public String insertSql(Entity entity) {
		dto = TableMapperCache.getInstance().get(entity.getClass());
		BEGIN();
		INSERT_INTO(dto.getTableName());
		Entry<String, String> entry = null;
		Iterator<Entry<String, String>> entryIt = dto.getFields().entrySet().iterator();
		VALUES("id", "#{id}");
		while (entryIt.hasNext()) {
			entry = entryIt.next();
			VALUES(entry.getValue(), "#{" + entry.getKey() + "}");
		}
		String sql = SQL();
		LOG.info("sql:" + sql);
		return sql;
	}
	
	/**
	 * @description 根据实体类进行更新操作
	 * @author fengya
	 * @date 2017年5月18日 上午9:16:51
	 * @param entity
	 * @return
	 * @throws 
	 * @return String
	 */
	public String updateSql(Entity entity) {
		dto = TableMapperCache.getInstance().get(entity.getClass());
		BEGIN();
		UPDATE(dto.getTableName());
		Entry<String, String> entry = null;
		Iterator<Entry<String, String>> entryIt = dto.getFields().entrySet().iterator();
		while (entryIt.hasNext()) {
			entry = entryIt.next();
			SET(entry.getValue() + "=" + "#{" + entry.getKey() + "} ");
		}
		WHERE("id=#{id}");
		String sql = SQL();
		LOG.info("sql:" + sql);
		return sql;
	}
	
	/**
	 * @description 根据实体类的ID进行判断是插入操作还是更新操作，ID为空是插入，ID不为空是更新操作
	 * @author fengya
	 * @date 2017年5月18日 上午9:17:15
	 * @param entity
	 * @return
	 * @throws 
	 * @return String
	 */
	public String saveOrUpdateSql(Entity entity) {
		if (StringUtil.isNullOrEmpty(entity.getId())) {
			entity.setId(IdGen.uuid());
			return this.insertSql(entity);
		} else {
			return this.updateSql(entity);
		}
	}
	
	/**
	 * @description 根据ID删除表中的记录
	 * @author fengya
	 * @date 2017年5月18日 上午10:08:10
	 * @param entity
	 * @return
	 * @throws 
	 * @return String
	 */
	public String deleteSql(Map<String,Object> params) {
		dto = TableMapperCache.getInstance().get((Class<?>)params.get("cls"));
		BEGIN();
		DELETE_FROM(dto.getTableName());
		WHERE("id=#{id}");
		String sql = SQL();
		LOG.info("sql:" + sql);
		return sql;
	}
}
